//-----------------------------------------------------------------
// Includes
//-----------------------------------------------------------------
#include "Pattern.hpp"
#include "../Tools/Logger.hpp"
#include <sstream>

//-----------------------------------------------------------------
// Includes
//-----------------------------------------------------------------
#define DEFAULT_PATTERN_DEPTH 0

namespace Calibration
{

	///////////////////////////////////////////////////////////////////
	// Constructeur
	///////////////////////////////////////////////////////////////////
	Pattern::Pattern( int rows, int columns, float size ):
	squareSize(size)
	{
		int nbInnerCorners; 
		int index;		
		
		// TODO : faire la vérification hauteur / largeur 
		nbInnerCornersRow = rows-1;
		nbInnerCornersColumn = columns-1;
		nbInnerCorners = nbInnerCornersRow*nbInnerCornersColumn;
		innerCornersMatrix = new CvPoint3D32f[nbInnerCorners];
		
		// Construction de la matrice des points 3D de la mire
		for(int rowIndex = 0; rowIndex < nbInnerCornersRow; rowIndex++)
		{
			for(int columnIndex = 0; columnIndex < nbInnerCornersColumn; columnIndex++)
			{
				index = (rowIndex*nbInnerCornersColumn)+columnIndex;			
				innerCornersMatrix[index].x = squareSize*(columnIndex+1);				
				innerCornersMatrix[index].y = squareSize*(rowIndex+1);
				innerCornersMatrix[index].z = DEFAULT_PATTERN_DEPTH;
			}
		}
	}
	
	///////////////////////////////////////////////////////////////////
	// Destructeur
	///////////////////////////////////////////////////////////////////
	Pattern::~Pattern()
	{
		delete[] innerCornersMatrix;
	}
	
	///////////////////////////////////////////////////////////////////
	// Retourne un tableau contenant l'ensemble des points 3D de la 
	// mire ordonnées de haut en bas et de gauche à droite 
	///////////////////////////////////////////////////////////////////
	CvPoint3D32f* Pattern::GetPatternPoints() const
	{
		return innerCornersMatrix;
	}
		
	///////////////////////////////////////////////////////////////////
	// Retourne le nombre de lignes
	///////////////////////////////////////////////////////////////////
	int Pattern::GetNumberOfInnerCornersPerRow() const
	{
		return nbInnerCornersRow;
	}
	
	///////////////////////////////////////////////////////////////////
	// Retourne le nombre de colonnes
	///////////////////////////////////////////////////////////////////
	int Pattern::GetNumberOfInnerCornersPerColumn() const
	{
		return nbInnerCornersColumn;
	}
	
	///////////////////////////////////////////////////////////////////
	// Retourne le nombre d'intersection interne (c'est à dire le 
	// nombre de coins internes
	///////////////////////////////////////////////////////////////////
	int Pattern::GetNumberOfInnerCorners() const
	{
		return nbInnerCornersRow*nbInnerCornersColumn;
	}
	
	///////////////////////////////////////////////////////////////////
	// Retourne la taille d'un coté d'un carré de la mire
	///////////////////////////////////////////////////////////////////
	float Pattern::GetSquareSize() const
	{
		return squareSize;
	}

}
